package com.cmy.method;

public class Method {
    /*
    * 方法:用来完成特定功能的代码片段
    * 方法的重载:在一个类中,函数名称相同(必须),形参不同(个数\类型\参数排列顺序)的函数
    *          返回类型不同不是重载的判断依据
    * 命令行传参
    *     有时希望在运行程序时在传递给它参数.需要靠传递命令行参数给main()函数实现
    *     Microsoft Windows[版本10.0.18363.1379]
          (c)2019 Microsoft Corporation。保留所有权利
          E:\learn Java\code\out\production\code>java com.cmy.method.Method my name is Void
          3
          6
          arg[0]my
          arg[1]name
          arg[2]is
          arg[3]Void
    *可变参数
    *   灵活的规定方法的参数数量
    *   在方法声名中,形参类型后+...
    *   为了防止歧义,可变参数必须唯一且放在最后
    *
    *递归
    *   自己调用自己,将大的问题一层一层剥离成小的问题
    *   解决最小的问题后,在一层一层解决回去,从而解决一个大的问题
    *   递归的使用,比较难理解,有时感觉莫名奇妙就用递归解决了问题
    *   递归根据问题的规模,可能调用大量的栈,而造成较高的存储空间消耗
    *   栈溢出可能是递归陷入死循环
    *递归结构:
    *   递归头:什么时候递归停止,没有将死循环
    *   递归体:什么时候递归
    * */



    //main方法
    public static void main(String[] args) {

        System.out.println(add(1,2));//3
        System.out.println(add(1,2,3));//6
        for (int i = 0;i<args.length;i++){
            System.out.println("args["+i+"]"+args[i]);
        }

        //输出可变参数
        //由于varParam不是静态方法,需要实例化调用
        Method method = new Method();
        method.findMax(7,2,5,8,1);
        System.out.println(method.factorial(5));



    }

    //自定义的add方法
    public static int add(int a,int b){
        return a+b;
    }

    //重载add方法
    public static int add(int a,int b,int c){
        return a+b+c;
    }

    //带有可变参数的方法
    public void findMax(int... a){
//        System.out.println(a);//这里输出的a是一个数组对象,用下标可访问具体值

        for(int i = 0;i<a.length;i++){
            if (a[0]<a[i]){
                a[0]=a[i];
            }
        }
        System.out.println(a[0]);
    }

    //利用递归实现求阶乘
    public double factorial(double num){
        double res = 0;
        //递归终止条件
        if (num==1){
            return 1;
        }else {
            return num*factorial(num-1);
        }

    }
}

    